X86 寄存器及寻址方式
X86 寄存器及寻址方式
絮絮叨叨:之前看的汇编都是 ARM Cotex M 系列,在调试任务切换时,不得不学习一下 x86 的汇编。
x86 寄存器列表
inter i386 平台下寄存器包括 8 个 32 位的通用寄存器、8 个调试寄存器、6 个 16 位的段寄存器、4 个 32 位的控制寄存器等寄存器。
使用最多的时 8 个通用寄存器,EAX、ECX、EDX、EBX、ESI、EDI、ESP、EBP 和一个程序指针寄存器 EIP。
8 个通用寄存器可以作为 16 位(字)或者 32 位(双字)进行访问,同时可以独立访问前四个寄存器(EAX、ECX、EDX、EBX)的低两字节。
x86 寄存器功能
x86 寄存器功能列表如下:
寄存器 | 功能 | 函数调用时 | 保护者 |
---|---|---|---|
eax | 累加器 | 作为返回值 | 调用者保护 |
ebx | 基地址寄存器 | 临时参数 | 被调用者保护 |
ecx | 计数器 | 第 4 个参数 | 调用者保护 |
edx | 中间数据寄存器 | 第 3 个参数 | 调用者保护 |
esi | 源变址寄存器 | 第 2 个参数 | 被调用者保护 |
edi | 目标变址寄存器 | 第 1 个参数 | 被调用者保护 |
ebp | 栈底指针 | - | 被调用者保存 |
esp | 栈顶指针 | - | - |
注:在 main 函数中调用函数 add ,main 为调用者,add 为被调用者。
在 main 函数调用 add 之前,应该将【EAX, ECX, EDX】保存到栈中。
在 add 函数中应该将【EBX, ESI, EDI, EBP】保存到栈中,在函数执行完成后,恢复原始数据。
操作数类型
在 x86 指令中,包括三类操作数:立即数、寄存器和存储器引用。
立即数:即常数,任何可以用 32 位寄存器表示的数,都可以作为立即数。
立即数使用前缀$
进行表示,后面可跟十进制或者十六进制。使用 代表任意立即数。
例如:$0x10
或者 $16
,都表示数字 16。
寄存器:用符号 表示任意寄存器 a , 使用 表示寄存器 a 的值。
存储器引用:存储器引用表示存储器某个地址的数据。
用 表示地址 Addr 的值。
寻址方式
x86 包括 7 种寻址方式,分别为:立即数寻址、寄存器寻址、绝对寻址、间接寻址、基址+偏移寻址、变址寻址、比例变址寻址。
前三种寻址方式的表示即上面立即数的表示方式。
间接寻址:通过访问寄存器 的值(),访问对应地址的值。
使用符号 表示。
例如:EAX
寄存器为 0x0001
,地址 0x0001
的值为0x1234
。则 的值为0x1234
基址+偏移寻址:通过寄存器 和立即数 ,访问地址: 处的值。使用符号 表示。
完整的寄存器寻址方式见下图
参考资料
[1]i386的寄存器: https://www.cnblogs.com/wang-can/p/3369184.html
[2]《深入理解计算机系统》: 3.4访问信息
[3]x86-64通用寄存器: https://www.cnblogs.com/sgawscd/p/11210026.html
end
爱技术,爱生活
这里是非典型技术宅,点击上方蓝字关注
欢迎点击 在看👀,点赞👍,收藏⭐
微信公众号|非典型技术宅